package co.com.bean.ciudad;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.Resource;
import javax.ejb.SessionContext;
import javax.ejb.Stateless;

import co.com.smart.maestro.infraestructure.dto.CiudadDTO;
import co.com.smart.maestro.infraestructure.dto.ResponseJson;
import co.com.smart.mapper.Mapper;
import co.com.smart.persistence.entity.CiudadFacadeLocal;
import co.com.smart.persistence.entity.dto.SmartCiudad;
import co.com.smart.session.DelegateContextEJB;
import co.com.smart.utilidades.Constantes;

/**
 * Session Bean implementation class PersonaBean
 */
@Stateless(mappedName = "ejb/CiudadBean")
public class CiudadBean implements CiudadBeanLocal{
	private CiudadFacadeLocal facade;
	

	@Resource
	private SessionContext session;
	
	public CiudadBean(){
		facade = DelegateContextEJB.getCiudadFacadeLocal();
	}
	
	

	@Override
	public ResponseJson insertarCiudad(CiudadDTO ciudadDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			ciudadDTO.setCousuario(session.getCallerPrincipal().getName());				
			ciudadDTO.setFhingreso(new Date());
			facade.create(Mapper.mapperDtoToSmartCiudad(ciudadDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad almacenada.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad almacenada.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible almacenar la ciudad.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}
		return response ;
	}
	
	@Override
	public List<CiudadDTO> consultarAllCiudad(){
		List<CiudadDTO> ciudad = new ArrayList<CiudadDTO>();
		for (SmartCiudad entity : facade.findAll()) {
			if(entity.getSmfhretiro() == null){
				ciudad.add(Mapper.mapperSmartCiudadToDto(entity));
			}
		}

		return ciudad;
	}
	
	@Override
	public List<CiudadDTO> consultarAllCiudad(CiudadDTO ciudad){
		List<CiudadDTO> ciudades = new ArrayList<CiudadDTO>();
		SmartCiudad filtro		 = Mapper.mapperDtoToSmartCiudad(ciudad);
		for (SmartCiudad entity : facade.filtrarCiudad(filtro)) {
			ciudades.add(Mapper.mapperSmartCiudadToDto(entity));
		}
		return ciudades;
	}

	@Override
	public CiudadDTO consultarCiudadId(CiudadDTO ciudadDTO) {
		CiudadDTO ciudad = new CiudadDTO();	
		SmartCiudad entity  = facade.find(ciudadDTO.getScciudad());
		if(entity != null && entity.getSmfhretiro() == null){
			ciudad = Mapper.mapperSmartCiudadToDto(entity);
		}
		return ciudad;
	}

	@Override
	public ResponseJson editCiudad(CiudadDTO ciudadDTO) {
		ResponseJson response = new ResponseJson(); 
		try {
			ciudadDTO.setFhmodificacion(new Date());
			facade.edit(Mapper.mapperDtoToSmartCiudad(ciudadDTO));
			response.setCodigo(Constantes.StatusResponse.OK.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad editada.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad editada.");
		} catch (Throwable e) {
			response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
			response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible editar la ciudad.");
			response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
		}
		return response ;
	}

	@Override
	public ResponseJson removeCiudad(CiudadDTO ciudadDTO,  boolean logic) {
		ResponseJson response = new ResponseJson(); 
		if(logic){
			try {
				ciudadDTO.setFhretiro(new Date());
				ciudadDTO.setFhmodificacion(new Date());
				facade.edit(Mapper.mapperDtoToSmartCiudad(ciudadDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad inactivado");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad inactivado.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible inactivar la ciudad.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}else{
			try {
				facade.remove(Mapper.mapperDtoToSmartCiudad(ciudadDTO));
				response.setCodigo(Constantes.StatusResponse.OK.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad eliminada");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_OK.getMensajeStatuss()+ "Ciudad eliminada.");
			} catch (Throwable e) {
				response.setCodigo(Constantes.StatusResponse.ERROR.getStatus());
				response.setMensaje(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+ "No fue posible eliminar la ciudad.");
				response.setMensajeInterno(Constantes.MensajeResponse.MSJ_ERROR.getMensajeStatuss()+e.getMessage());
			}
		}
		return response ;
	}
}
